package org.senzacontrollo.designPatterns;


import java.util.ArrayList;
import java.util.Vector;

import org.senzacontrollo.designPatterns.abstractFactory.CDDevicesFactory;
import org.senzacontrollo.designPatterns.abstractFactory.DeviceFactory;
import org.senzacontrollo.designPatterns.abstractFactory.Media;
import org.senzacontrollo.designPatterns.abstractFactory.Player;
import org.senzacontrollo.designPatterns.abstractFactory.Recorder;
import org.senzacontrollo.designPatterns.abstractFactory.TapeDevicesFactory;
import org.senzacontrollo.designPatterns.bridge.CompleteMatrix;
import org.senzacontrollo.designPatterns.bridge.Matrix;
import org.senzacontrollo.designPatterns.bridge.MatrixCell;
import org.senzacontrollo.designPatterns.bridge.SparseMatrix;
import org.senzacontrollo.designPatterns.builder.ERHardCodedDirector;
import org.senzacontrollo.designPatterns.builder.ErModel;
import org.senzacontrollo.designPatterns.builder.NotOrientedERBuilder;
import org.senzacontrollo.designPatterns.builder.OrientedERBuilder;
import org.senzacontrollo.designPatterns.composite.Component;
import org.senzacontrollo.designPatterns.composite.Composite;
import org.senzacontrollo.designPatterns.composite.SinglePart;
import org.senzacontrollo.designPatterns.composite.SinglePartException;
import org.senzacontrollo.designPatterns.singleton.PrintSpooler;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
    	/*
    	 * Abstract Factory
    	 * 
    	 * Presenta un'interfaccia per la creazione di famiglie di prodotti
    	 * in modo tale che il cliente che li utilizza non abbia conoscenza delle classi 
    	 * concrete. Questo consente:
    	 * 
    	 *  1- Assicurarsi che il cliente crei soltanto oggetti vincolati tra loro 
    	 *  2- L'utilizzo di diverse famiglie di prodotti da parte dello stesso cliente
    	 * 
    	
    	DeviceFactory tapeDeviceFactory = new TapeDevicesFactory();
    	Media media = tapeDeviceFactory.createMedia();
    	Player player = tapeDeviceFactory.createPlayer();
    	Recorder recorder = tapeDeviceFactory.createRecorder();
    	player.accept(media);
    	recorder.accept(media);
    	recorder.record("My tape Song");
    	player.player();
    	recorder.accept(media);
    	
    	DeviceFactory cdDeviceFactory = new CDDevicesFactory();
    	Media media2 = cdDeviceFactory.createMedia();
    	Player player2 = cdDeviceFactory.createPlayer();
    	Recorder recorder2 = cdDeviceFactory.createRecorder();
    	player2.accept(media2);
    	recorder2.accept(media2);
    	recorder2.record("My cd Song");
    	player2.player();
    	recorder2.accept(media2);
    	 */
    	
    	/*
    	 *---------------------------------Builder-------------------------------------
    	 * 
    	 * Separa la costruzione di un oggetto dalla sua rappresentazione, in modo che lo stesso processo 
    	 * di costruzione consenta la creazione di diverse rappresentazioni
    	 * 
    	 
    	ErModel model = (ErModel) ERHardCodedDirector.getModel(new NotOrientedERBuilder());
    	model.showConstruct();
    	
    	
    	String modelBis = (String) ERHardCodedDirector.getModel(new OrientedERBuilder());
    	System.out.println(modelBis);
    	
    	*/
    	
    	/*
    	 *--------------------------------Singleton-----------------------------------
    	PrintSpooler.getSpooler();
    	PrintSpooler.getSpooler();
    	*/
    	
    	/*---------------------------------Adapter------------------------------------
    	 * Converte l'interfaccia di una classe in un'altra interfaccia aspettata dai client. In questo modo 
    	 * si consente una collaborazione tra classi che altrimenti non avrebbero potuto collaborare
    	 */
    	
    	
    	
    	/*-------------Bridge---------------------*/
    	//Matrix matrix = new CompleteMatri
    	Matrix matrixComplete = new CompleteMatrix(10,10,new ArrayList<MatrixCell>());
    	Matrix matriSparse = new SparseMatrix(5,5,new Vector<MatrixCell>());
    	
    	
    	/*----------Composite-------------------*/
    	Component processor = new SinglePart("processor");
    	Component ram = new SinglePart("ram");
    	Component hd = new SinglePart("hd");
    	
    	Component mainSystem = new Composite("main system");
    	try {
			mainSystem.add(processor);
			mainSystem.add(hd);
			mainSystem.add(ram);
		} catch (SinglePartException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    	
    	
    	
    	
    }
}
